package com.jsbs.iam.auth.mapper;

import com.jsbs.iam.auth.dto.IamRoleBindUserDto;
import com.jsbs.iam.auth.dto.IamRoleCreateDto;
import com.jsbs.iam.auth.dto.IamRoleUpdateStatusDto;
import com.jsbs.iam.auth.entity.IamRole;
import com.jsbs.iam.auth.param.IamApplyDetaislParam;
import com.jsbs.iam.auth.param.IamRoleRemoveUserParam;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * @ClassName: IamRoleManagerMapper
 * @Author: tenghuawei
 * @Date: 2022/12/26 13:39
 * @Description:
 */

@Mapper
@Repository
public interface IamRoleManagerMapper {

    /**
     * 功能描述：根据角色编码和角色名称，模糊查询角色列表
     * @param iamRoleCreateDto
     * @return list
     */
    List<IamRole> queryIamRole(@Param("iamRoleCreateDto")IamRoleCreateDto iamRoleCreateDto);

    /**
     * 功能描述：角色新建
     * @param iamRoleCreateDto
     * @return int
     */
    int roleCreate(@Param("iamRoleCreateDto") IamRoleCreateDto iamRoleCreateDto);

    /**
     * 功能描述：获取角色编码当前最大值
     * @param
     * @return Integer
     */
    Integer getMaxRoleCode();

    /**
     * 功能描述：角色编辑
     * @param iamRoleCreateDto
     * @return int
     */
    int roleEdit(@Param("iamRoleCreateDto") IamRoleCreateDto iamRoleCreateDto);

    /**
     * 功能描述：角色删除：根据 普管角色编码+普通用户角色编码+租户编码筛选
     * @param roleCode
     * @param companyCode
     * @return boolean
     */
    boolean roleDelete(@Param("adminRoleCode")String adminRoleCode,
                       @Param("roleCode")String roleCode,
                       @Param("companyCode")String companyCode);

    /**
     * 功能描述：角色启用和禁用
     * @param
     * @return int
     */
    int updateRoleStatus(@Param("iamRoleUpdateStatusDto")IamRoleUpdateStatusDto iamRoleUpdateStatusDto);

    /**
     * 功能描述：控制角色名称不可重复
     * @param iamRoleCreateDto
     * @return int
     */
    int verifiRoleName(@Param("iamRoleCreateDto")IamRoleCreateDto iamRoleCreateDto);

    /**
     * 功能描述：根據角色编码查拥塞名称；用于角色编辑时，如果修改了角色名称，要对该角色名称进行判断：表中是否已存在了该角色名称；
     * 如果没有修改角色名称，跳过逻辑判断
     * @param iamRoleCreateDto
     * @return String
     */
    String queryRoleName(@Param("iamRoleCreateDto")IamRoleCreateDto iamRoleCreateDto);

    /**
     * 功能描述：根据角色编码+租户编码，查询该角色下绑定的用户数量
     * @param roleCode
     * @return int
     */
    int queryUserByRoleCode(@Param("roleCode")String roleCode,
                            @Param("companyCode")String companyCode);

    /**
     * 功能描述：可根据用户编码、姓名，模糊查询某个角色下所有绑定的用户
     * @param roleCode
     * @param companyCode
     * @return
     */
    List<String> queryRoleBindUsers(@Param("roleCode")String roleCode,
                                    @Param("companyCode")String companyCode);

    /**
     * 功能描述：角色移除用户
     * @param iamRoleRemoveUserParam
     * @return int
     */
    int roleRemoveUsers(@Param("iamRoleRemoveUserParam")IamRoleRemoveUserParam iamRoleRemoveUserParam);

    /**
     * 功能描述：角色绑定用户
     * @param
     * @return
     */
    int iamRoleBindUserDto(@Param("iamRoleBindUserDto")IamRoleBindUserDto iamRoleBindUserDto);

    /**
     * 功能描述：某个角色在绑定用户时，限制roleCode、userCode重复数据不可插入
     * @param roleCode、userCode
     * @return int
     */
    int verifiRoleBindUser(@Param("roleCode")String roleCode,@Param("userCode")String userCode);

    /**
     * 功能描述：根据用户id+租户，查询该用户的归属的所有的 角色编码+应用编码
     * @param iamApplyDetaislParam
     * @return int
     */
    @MapKey("id")
    List<Map<String,String>> queryApplyCodeByUserCode(@Param("iamApplyDetaislParam")IamApplyDetaislParam iamApplyDetaislParam);

}
